package com.example.demo.config.login;


import com.example.demo.result.R;
import com.example.demo.result.ResultCode;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class UserLoginInterceptor implements HandlerInterceptor {

    /***
     * 在请求处理之前进行调用(Controller方法调用之前)
     * 执行了拦截器的--------------->preHandle方法
     * 执行了拦截器的-------------->postHandle方法
     * 执行了拦截器的--------->afterCompletion方法
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行了拦截器的--------------->preHandle方法");
        try {
            HttpSession session = request.getSession();
            //统一拦截（查询当前session是否存在user）(这里user会在每次登录成功后，写入session)
            Userparam user = (Userparam) session.getAttribute(session.getId());
            System.out.println("sessionid:"+session.getId());
            System.out.println(user);
            if (user != null) {
                System.out.println("登录用户:"+user.getUsername());
                return true;
            }
            /*response.sendRedirect(request.getContextPath() + "test4.html");*/
            /*response.sendRedirect(request.getContextPath() + "ToLogin");*/
            /*RequestDispatcher dispatcher = request.getRequestDispatcher("login.html");*/

            /*RequestDispatcher dispatcher = request.getRequestDispatcher("/ToLogin");
            dispatcher.forward(request, response);//执行转发*/

            redirect(request,response);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
        //如果设置为false时，被请求时，拦截器执行到此处将不会继续操作
        //如果设置为true时，请求将会继续执行后面的操作
    }

    // 对ajax的重定向进行处理
    public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //获取当前请求的路径：协议://服务器名:端口号/项目名
        String basePath = request.getScheme() + "://" + request.getServerName() + ":"  + request.getServerPort()+request.getContextPath();

        //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求，需要特殊处理 否则直接重定向就可以了
        if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
            //自定义响应头 告诉ajax我是重定向，用ajax进行判断。
            response.setHeader("REDIRECT", "REDIRECT");
            //自定义响应头 告诉ajax我重定向的路径
            response.setHeader("CONTEXTPATH", basePath+"/tokentimeout");
            // response.setHeader("Content-Type", "application/json;charset=UTF-8"); 这句没必要
            // 设置这次请求状态码为403 禁止访问
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);

        }else{
            // 如果不是ajax 就正常重定向
            System.out.println("重定向登录");
            System.out.println(basePath + "/tokentimeout");
            response.sendRedirect(basePath + "/tokentimeout");
            //response.sendRedirect(request.getContextPath() + "tokentimeout");

        }
    }



    /***
     * 请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行了拦截器的-------------->postHandle方法");
    }

    /***
     * 整个请求结束之后被调用，也就是在DispatchServlet渲染了对应的视图之后执行（主要用于进行资源清理工作）
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("执行了拦截器的--------->afterCompletion方法");
    }
}